package other;

/**
 * 题目：把字符串转为数字
 * @Author Gavin
 * @date 2022.01.02 12:07
 */
public class solution_1 {
    /**
     * 思路：主要就是各个边界值的判断
     * 1.可以有前导空格或者前导0，但不能有其它前导字符串
     * 2.可能会有一个加号或者减号表示正负，也可能没有，连续的多个加号或者减号则视为不合法
     * 3.紧接着是一段连续的数字，如果没有数字则视为不合法
     * 4.数字后的其它字符串都可以忽略
     * 5.如果数字大于int的最大值或小于int的最小值，返回相应的极值即可
     * 6.字符串如果不能合法的转为整数，则返回0
     */
    public static int solution(String str){
        int start=0,p=0,n=str.length();
        boolean negative=false;
        while (p<n&&str.charAt(p)==' ')++p;//去除前面的空格
        if(p==n)return 0;//说明全部都是空格

        //判断正负
        if(str.charAt(p)=='+'){
            ++p;
        }else if(str.charAt(p)=='-'){
            ++p;
            negative=true;
        }
        //跳过0
        while (p<n&&str.charAt(p)=='0')++p;//去除数字前面的0
        start=p;
        while (p<n&&str.charAt(p)>='0'&&str.charAt(p)<='9')++p;
        if(p==start)return 0;//表示字符不合法

        if(p-start>10){//表示数字大小超出范围了
            if(negative)return Integer.MIN_VALUE;
            else return Integer.MAX_VALUE;
        }

        long num=0;
        for(int i=start;i<p;++i){
            System.out.println(str.charAt(i));
            //注意字符 '0'表示数字48，'1'表示49，所以需要减去'0'
            num=num*10+(str.charAt(i)-'0');
        }
        num=negative?-num:num;

        if(num<Integer.MIN_VALUE)return Integer.MIN_VALUE;
        else if (num>Integer.MAX_VALUE)return Integer.MAX_VALUE;
        else return (int)num;

    }

    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        System.out.println(solution("  -12"));
    }
}
